package com.zlzlib.limiter;

import com.google.common.collect.Maps;
import com.google.common.util.concurrent.RateLimiter;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @DateTime: 2023/5/11 11:10
 * @Author zlz
 * @Version 1.0
 */
@Component
public class LimiterGuava implements LimiterManager {

    /**
     * 不同的接口，不同的流量控制
     * map的key为 Limiter.key
     */
    private final Map<String, RateLimiter> limitMap = Maps.newConcurrentMap();


    @Override
    public boolean tryAccess(LimitReq limitReq, String key) {
        if (key == null) {
            return true;
        }
        //key作用：不同的接口，不同的流量控制
        RateLimiter rateLimiter;
        //验证缓存是否有命中key
        if (!limitMap.containsKey(key)) {
            // 创建令牌桶
            rateLimiter = RateLimiter.create(limitReq.limitCount());
            limitMap.put(key, rateLimiter);
        }
        rateLimiter = limitMap.get(key);
        // 拿令牌
        return rateLimiter.tryAcquire(limitReq.timeout(), limitReq.timeunit());
    }
}
